﻿//适配器模式
//适配器可以通过以不同抽象货接口类型实例为参数的构造函数来书别，当适配器的任何方法被调用时，他会将参数转换为合适的格式，然后将调用定向到其封装对象中的一个或多个方法

//问题：假如你正在开发一筐股票市场检测程序，他会从不同来源下载XML格式的股票数据，然后向用户呈现出美观的图表。
//在开发过程中，你决定在程序中整合一个第三方智能分析函数库。但是遇到一个问题，那就是分析行数库只兼容JSON格式的数据

//解决方案：你可以创建一个适配器，这是一个特殊的对象，能偶转换对象接口，使其能与其他对象进行交互。
//适配器模式通过封装对象将复杂的转化过程隐藏于幕后。被封装的对象甚至察觉不到适配器的存在，例如，你可以使用一个将所有数据转换为英制单位（如英尺和英里）的适配器封装运行于米和千米单位制的对象中

//可以创建一个双向适配器来实现双向转换调用

Adaptee adaptee = new Adaptee();
ITarget target = new Adapter(adaptee);
Person Person = new();

Console.WriteLine(target.GetRequest());

public record Person(string FirstName, string LastName);

//适配器接口，此接口是用于实现Adapter转化适配Adaptee
public interface ITarget
{
    string GetRequest();
}

internal class Adaptee
{
    public string GetSpecificRequest()
    {
        return "Specific request.";
    }
}

//Adapter适配Adaptee,因此继承接口，实现适配器
internal class Adapter : ITarget
{
    private readonly Adaptee _adaptee;

    public Adapter()
    {
    }

    public Adapter(Adaptee adaptee)
    {
        _adaptee = adaptee;
    }

    public string GetRequest()
    {
        return $"Thisis '{this._adaptee.GetSpecificRequest()}'";
    }
}